管理者如果想要透過容器執行一個簡單的NGINX網站服務可以有以下三種方式來實作:
上述一系列需求動作都是透過docker daemon來做動作調用監視包含下圖中執行Docker Images並啟動容器或停止刪除容器等做有動作的執行與結果呈現反饋給用戶。
這只需要足夠的空間並回應上傳下載的資源映像需求並把一個個所定義編排的映像檔放置好等著做提取進出的動作。
分別針對上述的自虐架構行為各元件服務更深入探討>>
用戶端透過Docker Client和docker daemon建立通訊的溝通工具,可執行檔案為Dockerfile,透過docker命令對各種容器發起執行需求。
docker daemon是容器架構中常駐後台的系統程序,用來接收處理docker client傳送請求。當daemon在後台啟動一個server來接收docker client的傳送請求;Server可透過路由與分派排程任務找到相應handler來執行請求。
Engine是容器架構中的執行引擎,很重要的核心模組。主要是控制執行這一個個job任務來達到管理容器的目的。
Job是Docker Engine內最小工作執行單位。每項可執行的工作任務,都視同一個job,如:建立一個新容器實屬一個job,從網路下載一個映像檔也是一個job,建立Server對外HTTP也是一個job等等..
Docker Registry任務就是容器映像的倉庫空間。當映像檔在容器被建立時載入用來初始化容器的檔案結構目錄。Docker執行過程中Daemon會與Registry通訊,實踐搜尋,上下傳映像這三項重要核心功能,附帶一提對應job命名分別是”search”,”pull” 與 “push”。
Graph這服務主要是下載間關係與下載完成後的容器映像保管與記錄。另外Graph也儲存本地具版本資訊的檔案系統映像,透過GraphDB記錄著所有檔案系統映像之間的關係。其具體儲存資訊包含:該容器映像中介資料,映像大小及該容器映像所代表的rootfs。
Driver是Docker中驅動模組程式。可實現Docker容器執行環境自定義。因為Docker生命週期裡並非所有操作都是針對容器管理,還包含其他雜事包含Docker資訊獲取,Graph儲存與記錄等。
所以為了讓容器管理從Docker Daemon邏輯工作拆分,故設計出Driver層級的獨立服務來接管這類雜事的請求。
而就是因為很雜,所以又分出三組分別為:Graphdriver、networkdriver和execdriver。
Graphdriver上述也說明到主要就是用於完成容器映像儲存與獲取。而細部包含四種檔案系統在其內部註冊分別為aufs、btrfs、vfs與devmapper。
Networkdriver很明顯名詞已經猜得出來就是為了容器網路環境配置,包含如:Docker啟動時為容器環境建立專用虛擬網卡並綁定網路Bridge;為容器分配 IP位址、網路連接埠並與宿主伺服器網路做Ports映射以及防火牆等安全Policy等..
Execdriver則負責建立容器執行名稱空間,任務包含使用統計與限制,容器內部程序執行等..原來從前是透過LXC來操控容器配置及生命週期,而現在execdriver原生改使用native驅動,故已經不在依賴LXC。
libcontainer設計的初衷就是直接存取容器核心相關API服務。透過所提供的標準介面來滿足Docker上層對容器直接的管理要求。其中控制元件如:Namespace、cgroups、apparmor、網路連接等....